package cn.kgc.spring.day04.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * @author 课工场
 * @date 2024/7/16
 * @description 基于jdk的动态代理
 */
public class JDKProxy {

    // 被代理对象
    private Object obj;

    public JDKProxy(Object obj) {
        this.obj = obj;
    }


    /*
    *  ClassLoader loader,      类加载器   jvm虚拟机不会分配类加载器给动态生成的对象
       Class<?>[] interfaces,   被代理对象实现接口的数组
       InvocationHandler h       增强业务封装的对象
    * */

    // 返回一个对象的代理对象
    public Object getBeanProxy() {

        // ClassLoader loader
        ClassLoader classLoader = this.getClass().getClassLoader();
        // Class<?>[] interfaces
        Class<?>[] interfaces = obj.getClass().getInterfaces();
        /**
         *  InvocationHandler
         *  proxy  :   被代理对象
         *  method :  方法对象     代理对象调用的方法对象
         *  args:     方法参数     代理对象调用的方法的参数
         */

        InvocationHandler invocationHandler = (proxy, method, args) -> {

            System.out.println("----上课时间到了,请开始上课----");

            //  基础方法的执行
            Object invoke = method.invoke(obj, args);

            System.out.println("----下课时间到了,请准时下课----");

            return invoke;

        };

        // 代理对象
        Object o = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);

        return o;
    }
}
